import { reactive, toRaw } from "vue";

// 分页钩子函数
interface Options {
    page?: number;
    size?: number;
    fetchFun: (page: number, pageSize: number, isPageable?: boolean) => Promise<any>;
    params?: Record<any, any>;
    fixedParams?: Record<any, any>;
    firstLoading?: boolean;
}

// hook 返回的分页数据对象类型
interface Pager<D = any> {
    page: number; // 当前页码
    size: number; // 每页数量
    loading: boolean; // 加载状态
    count: number; // 总数据量
    pages: number; // 总页数
    lists: D[]; // 数据列表
    extend: Record<string, any>; // 扩展数据字段
}

/**
 * 分页数据获取自定义 Hook
 * @param options 配置选项
 *   @property {number} [page=1] - 初始页码
 *   @property {number} [size=15] - 每页数据量
 *   @property {Function} fetchFun - 数据获取函数（需返回 Promise）
 *   @property {Object} [params={}] - 可变请求参数（支持响应式）
 *   @property {Object} [fixedParams={}] - 固定请求参数（不会重置）
 *   @property {boolean} [firstLoading=false] - 是否初始加载数据
 * @returns {Object} 返回分页相关对象和方法
 *   @property {Object} pager - 分页状态管理对象
 *     @property {number} page - 当前页码
 *     @property {number} size - 每页数量
 *     @property {boolean} loading - 加载状态
 *     @property {number} count - 总数据量
 *     @property {number} pages - 总页数
 *     @property {Array} lists - 数据列表
 *     @property {Object} extend - 扩展数据字段
 *   @property {Function} getLists - 执行数据获取（自动处理页码参数）
 *   @property {Function} resetParams - 重置可变参数并刷新数据
 *   @property {Function} resetPage - 重置到第一页并刷新数据
 *
 * @description
 * 1. 自动合并页码参数(page_no, page_size)、可变参数和固定参数
 * 2. 维护分页状态和加载状态
 * 3. 提供参数重置和页码重置功能
 * 4. 参数初始化时会转为原生对象避免响应式污染
 */
export function usePaging<T = any>(options: Options) {
    const { page = 1, size = 10, fetchFun, params = {}, fixedParams = {}, firstLoading = false } = options;

    // 记录分页初始参数，代理对象转成原生js对象
    const paramsInit: Record<any, any> = Object.assign({}, toRaw(params));
    // 分页数据
    const pager = reactive<Pager<T>>({
        page,
        size,
        pages: 0,
        loading: firstLoading,
        count: 0,
        lists: [],
        extend: {}
    });
    // 请求分页接口
    const getLists = async () => {
        pager.loading = true;
        // 过滤空值请求参数
        Object.keys(params).forEach(item => {
            if (params[item] === null || params[item] === undefined || params[item] === "") {
                Reflect.deleteProperty(params, item);
            }
        });
        // return fetchFun({
        //     current: pager.page,
        //     size: pager.size,
        //     ...params,
        //     ...fixedParams
        // })
        //     .then((res: any) => {
        //         pager.count = res.total;
        //         pager.pages = res.total ? Math.ceil(res.total / pager.size) : 0;
        //         pager.lists = res.list;
        //         pager.extend = res.extend || {};
        //         return Promise.resolve(res);
        //     })
        //     .catch((err: any) => {
        //         return Promise.reject(err);
        //     })
        //     .finally(() => {
        //         pager.loading = false;
        //     });
        const res = await fetchFun(pager.page, pager.size);
        pager.lists = res.data;
        pager.count = res.items;
        pager.pages = res.pages
        pager.loading = false;
    };
    // 重置为第一页
    const resetPage = () => {
        pager.page = 1;
        getLists();
    };
    // 重置参数
    const resetParams = () => {
        Object.keys(paramsInit).forEach(item => {
            params[item] = paramsInit[item];
        });
        getLists();
    };
    return {
        pager,
        getLists,
        resetParams,
        resetPage
    };
}
